#include <stdio.h>

//最大油价
const int MaxPrice=1000;

void printArray(int* array,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%d\n",array[i]);
    }
    printf("\n");
}

void printArrayf(float* array,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("%f\n",array[i]);
    }
    printf("\n");
}

float min(float f1,float f2)
{
    return f1<f2?f1:f2;
}

void sort(int* array,int n)
{
    int i,j;
    int** queue=new int*[n];
    int start=0;
    int end=1;
    queue[start]=new int[2];
    queue[start][0]=0;
    queue[start][1]=n;
    //开始快排
    while (start<end)
    {
        int s=queue[start][0];
        int e=queue[start][1];
        
        i=s;
        j=e-1;
        int tmpIndex=j;
        int tmp=array[tmpIndex];
        while (i<j)
        {
            if(tmpIndex==j)
            {
                //前面大于后面
                if(array[i]>tmp)
                {
                    array[tmpIndex]=array[i];
                    tmpIndex=i;
                    // tmp=array[tmpIndex];
                }
            }
            else
            {
                //前面大于后面
                if(tmp>array[j])
                {
                    array[tmpIndex]=array[j];
                    tmpIndex=j;
                    // tmp=array[tmpIndex];
                }
            }

            if(tmpIndex==j)
            {
                i++;
            }
            else{
                j--;
            }

            
        }

        array[i]=tmp;

        start++;
        if(s<i)
        {
            end++;
            queue[end-1]=new int[2];
            queue[end-1][0]=s;
            queue[end-1][1]=i;
        }

        if(i+1<e)
        {
            end++;
            queue[end-1]=new int[2];
            queue[end-1][0]=i+1;
            queue[end-1][1]=e;
        }
    }

    for(i=0;i<end;i++)
    {
        delete queue[i];
    }
    delete queue;
}

int main(){
    float ** shuruArray;
    float d1,c,d2,p;

    int n,i;
    scanf("%f %f %f %f %d",&d1,&c,&d2,&p,&n);
    shuruArray=new float*[n+2];
    //起点
    shuruArray[0]=new float[2];
    shuruArray[0][0]=0;
    shuruArray[0][1]=p;

    for(i=1;i<=n;i++)
    {
        shuruArray[i]=new float[2];
        scanf("%f %f",&shuruArray[i][0],&shuruArray[i][1]);
    }
    n+=2;

    //终点
    shuruArray[n-1]=new float[2];
    shuruArray[n-1][0]=d1;
    shuruArray[n-1][1]=0;

    //加满油最大行驶距离
    float maxjl=c*d2;
    //最大汽油消耗
    // float maxQ=d1/d2;
    int flag=1;

    //检查可以通行吗

    for(i=1;i<n;i++)
    {
        float jl=shuruArray[i][0]-shuruArray[i-1][0];
        if(jl>maxjl)
        {
            flag=0;
            break;
        }
    }

    if(flag)
    {
        //记录所有需要经过的点
        int* pointIndex=new int[n];
        int pointLen=1;
        pointIndex[0]=0;

        //搜索使用的栈
        int** queue=new int *[n];
        int end=1;
        queue[0]=new int[2];
        queue[end-1][0]=0;
        queue[end-1][1]=n-1;

        while (end>0)
        {
            int s=queue[end-1][0];
            int e=queue[end-1][1];

            //出栈
            end--;

            //中间没有其他点了就不需要检查了
            if(s<e-1)
            {
                float jl=shuruArray[e][0]-shuruArray[s][0];
                float min=MaxPrice;
                int minIndex=-1;

                //搜索最小油价
                for(int i=s+1;i<e;i++)
                {
                    if(shuruArray[i][1]<min)
                    {
                        min=shuruArray[i][1];
                        minIndex=i;
                    }
                }

                //判断需要增加途径点的条件  1起点不能直接走到终点 或者中间有油价更低的点
                if(jl>maxjl||shuruArray[s][1]>min)
                {
                    pointIndex[pointLen]=minIndex;
                    pointLen++;

                    queue[end]=new int[2];
                    queue[end][0]=s;
                    queue[end][1]=minIndex;
                    end++;

                    queue[end]=new int[2];
                    queue[end][0]=minIndex;
                    queue[end][1]=e;
                    end++;
                }


            }
        }
        
        pointIndex[pointLen]=n-1;
        pointLen++;

        //按序号排序
        sort(pointIndex,pointLen);
        // printArray(pointIndex,pointLen);

        //每个点加多少油 等效成距离
        float* jl_result=new float[pointLen];
        //车辆行驶到这里还剩多少油 等效成距离
        float* sy_result=new float[pointLen];
        sy_result[0]=0;

        for(i=1;i<pointLen;i++)
        {
            float itemJl=shuruArray[pointIndex[i]][0]-shuruArray[pointIndex[i-1]][0];
            //计算最大需要多少油 比较邮箱最大加油量和到终点的距离
            float jl=d1-shuruArray[pointIndex[i-1]][0];
            float maxItemJl=min(maxjl,jl)-sy_result[i-1];
            //当前这个点比下个点便宜 就加最大油
            if(shuruArray[pointIndex[i-1]][1]<shuruArray[pointIndex[i]][1])
            {
                jl_result[i-1]=maxItemJl;
                sy_result[i]=sy_result[i-1]+maxItemJl-itemJl;
            }
            //当前这个点比下个点贵只加刚好行驶到下个点的油
            else{
                jl_result[i-1]=itemJl-sy_result[i-1];
                sy_result[i]=0;
            }
        }
        
        // printArrayf(jl_result,pointLen-1);

        float result=0;
        for(i=0;i<pointLen-1;i++)
        {
            result+=jl_result[i]/d2*shuruArray[pointIndex[i]][1];
        }

        result=((int)(result*100+0.5f))/100.0f;
        printf("%.2f\n",result);
        

        for(i=0;i<end;i++)
        {
            delete queue[i];
        }
        delete queue;
        delete pointIndex;
        delete jl_result;
        delete sy_result;
    }
    else{
        printf("No Solution\n");
    }

    for(i=0;i<n;i++)
    {
        delete shuruArray[i];
    }
    delete shuruArray;
    return 0;
}